#include<STC15F2K60S2.H>
#include<LCD.h>
#include<DAC.h>

sbit a=P3^2;							//EC11编码器a端，下降沿触发
sbit b=P3^7;							//EC11编码器b端，高低电平判断正反旋
sbit f=P3^6;							//EC11编码器按键，按下拉低电平

int e=0,m=0;							//e为数据更改标志，m为光标位置数据
long int c=0,v=0;						//数据存储（c为电流设定值，v为电压设定值）

///////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////初始化函数////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////

void init_uart()						//串口初始化
{
	TMOD=0x20;
	TH1=0xfd;
	TL1=0xfd;
	TR1=1;
	SM0=0;
	SM1=1;								//工作模式设定
	EA=1;								//开总中断
	ES=1;								//开串口中断
}

///////////////////////////////////////////////////////////////////////////////////////

void delay_ms(int y)
{
	int j;
	for(;y>=0;y--)
		for(j=10;j>=0;j--);
}

long int pow(int m)						//次方函数
{
	long int y=1;
	for(;m>0;m--)
	{
		y=y*10;
	}
	return(y);
}
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////中断初始化///////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

void init_interrupt()					//中断初始化
{
	IT0=1;								//指定外部中断0上升、下降沿触发，IT0
	EX0=1;								//使能外部中断
	EA=1;								//开总中断
}
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////中断函数////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

void uart()interrupt 4					//串口中断函数
{
	RI=0;								//软件清零，以产生下一次中断
}
void xuanzhuan()interrupt 0				//外部中断函数
{	
	delay_ms(5);
	if(f==1)							//没按下旋钮
	{
		delay_ms(5);
		if(b==0)						//正旋
		{
			if(m<6)
			{
				c=c+pow(m);
				if(c>=999999)
					c=999999;
			}
			else
			{
				v=v+pow(m-6);
				if(v>=999999)
					v=999999;
			}
		}
		else							//逆旋
		{
			if(m<6)
			{
				c=c-pow(m);
				if(c<=0)
					c=0;
			}
			else
			{
				v=v-pow(m-6);
				if(v<=0)
					v=0;
			}
		}
		e=1;							//更新数字标志位
	}
	else								//按下旋钮
	{
		delay_ms(5);
		if(b==0)						//正旋
		{
			m=m-1;
			if(m<0)
				m=11;
		}
		else							//逆旋
		{
			m=m+1;
			P16=0;
			if(m>11)
				m=0;
		}
		e=1;							//更新位置标志位
	}
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////主函数//////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void main()
{
	init_interrupt();
	init_uart();
	init_LCD();
	while(1)
	{
		if(e==1)						//判断是否要写数据
		{
			if(m<6)
			{
				write_current();
			}
			else
			{
				write_voltage();
			}
			e=0;						//标志位清零
		}
		SBUF=c;
		while(!TI);
		TI=0;
		SBUF=v;
		while(!TI);
		TI=0;
		//write_DAC();					//调用DAC写函数
	}
}